#include "cmdcontrol.h"

void CmdControl::load_yaml()
{
    try {
        // 加载YAML文件
        YAML::Node config = YAML::LoadFile(yaml_file);
        if (!config) {
            throw std::runtime_error("YAML文件加载失败，文件可能不存在或为空");
        }

        // 解析串口参数（注意YAML中的"parameters"节点）
        YAML::Node param_node = config["parameters"];
        if (!param_node) {
            throw std::runtime_error("YAML中未找到'parameters'节点");
        }

        // 读取参数（使用value_or设置默认值，或强制检查必须存在的参数）
        serial_config.port = param_node["port"].as<std::string>();
        serial_config.framer = param_node["framer"].as<std::string>();
        serial_config.baud_rate = param_node["baud_rate"].as<int>();
        serial_config.bytesize = param_node["bytesize"].as<int>();
        serial_config.parity = param_node["parity"].as<std::string>();
        serial_config.stopbits = param_node["stopbits"].as<int>();
        serial_config.timeout = param_node["timeout"].as<double>();

        // 打印解析的参数（调试用）
        std::cout << "解析串口配置成功：" << std::endl;
        std::cout << "  端口: " << serial_config.port << std::endl;
        std::cout << "  帧格式: " << serial_config.framer << std::endl;
        std::cout << "  波特率: " << serial_config.baud_rate << std::endl;
        std::cout << "  数据位: " << serial_config.bytesize << std::endl;
        std::cout << "  校验位: " << serial_config.parity << std::endl;
        std::cout << "  停止位: " << serial_config.stopbits << std::endl;
        std::cout << "  超时时间: " << serial_config.timeout << "秒" << std::endl;

        // 初始化串口（假设SerialPort的构造函数接受这些参数，或提供init方法）
        // 根据你的SerialPort类接口调整，这里以构造函数为例
        serialport = std::make_unique<SerialPort>(
            serial_config.port,
            serial_config.baud_rate,
            serial_config.parity,
            serial_config.bytesize,
            serial_config.stopbits
        );

        std::cout << "串口初始化成功" << std::endl;

    }
    catch (const YAML::Exception& e) {
        // YAML解析错误（如格式错误、字段不存在）
        throw std::runtime_error("YAML解析失败: " + std::string(e.what()));
    }
    catch (const std::exception& e) {
        // 其他错误（如串口初始化失败）
        throw std::runtime_error("串口配置失败: " + std::string(e.what()));
    }
}

std::string CmdControl::bytes_to_hex_string(const std::vector<uint8_t>& bytes)
{
    std::string hex_str;
    if (bytes.empty()) {
        return hex_str;  // 空字节数组返回空字符串
    }

    // 预留空间，优化性能（每个字节对应5个字符："0xHH "，最后一个少1个空格）
    hex_str.reserve(bytes.size() * 5 - 1);

    for (size_t i = 0; i < bytes.size(); ++i) {
        // 使用std::format格式化单个字节为"0xHH"（大写十六进制）
        hex_str += std::format("0x{:02X}", bytes[i]);

        // 非最后一个字节后加空格
        if (i != bytes.size() - 1) {
            hex_str += " ";
        }
    }

    return hex_str;
}

void CmdControl::press_button(const std::string& id)
{
    // 获取字节数组（std::vector<uint8_t>）
    std::vector<uint8_t> cmds = parser.get_frame(id);
    if (cmds.empty()) {
        std::cerr << "未获取到对应ID的指令: " << id << std::endl;
        return;
    }

    std::string message = bytes_to_hex_string(cmds);

    // 发送转换后的字符串到串口
    if (serialport) {
        serialport->write_to_serial(message, true);
        std::cout << "发送指令: " << message << std::endl;
    }
    else {
        std::cerr << "串口未初始化，无法发送指令" << std::endl;
    }
}

void CmdControl::release_button(const std::string& id)
{
    std::vector<uint8_t> cmds = parser.get_frame(id);
    if (cmds.empty()) {
        std::cerr << "未获取到对应ID的指令: " << id << std::endl;
        return;
    }

    std::string message = bytes_to_hex_string(cmds);

    // 发送转换后的字符串到串口
    if (serialport) {
        serialport->write_to_serial(message, true);
        std::cout << "发送指令: " << message << std::endl;
    }
    else {
        std::cerr << "串口未初始化，无法发送指令" << std::endl;
    }
}
